import cv2
import os
import numpy as np
from PIL import Image

def face_train():
    print("开始训练...\n")
    #创建一个训练器
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    #训练照片，需要2组数据，一个是id，一个是图片特征
    faceCascade = cv2.CascadeClassifier("E:\python\Lib\site-packages\cv2\data/haarcascade_frontalface_alt2.xml")
    img_path = 'E:\Python文件\OpenCV\Facedata'       #照片的路径文件夹

    all_image_paths = [os.path.join(img_path,f) for f in os.listdir(img_path)]

    ids=[]      #id
    face_samples=[]     #放脸信息

    for each_img in all_image_paths:
        id = int(os.path.split(each_img)[1].split('.')[1])  #取出图片的id
        PIL_img = Image.open(each_img).convert('L')   #把读到的这张图片转成灰度数据
        np_img = np.array(PIL_img,'uint8')      #把图片数据进行格式长度转换为8位的数据矩阵
        faces = faceCascade.detectMultiScale(np_img)    #检测转换后的数据矩阵里面有没有脸 
        for (x,y,w,h) in faces:
            ids.append(id)
            face_samples.append(np_img[y:y+h,x:x+w])


    #进行训练，需要2个参数：face_samples所有脸的数据，ids放的是id（用np.array[ids],重新排序）
    recognizer.train(face_samples,np.array(ids))
    #people.yml 训练完的照片特征文件，识别的时候会用到
    recognizer.write('people.yml')
    print("训练完成\n")
if __name__ == "__main__":  
    face_train()